// leak.cpp
#include <iostream>
using namespace std;

// 基类析构函数故意不写成虚函数
class Base
{
public:
    Base()
    {
        //cout << "Base()\n";
    }
    ~Base() 
    { 
        //cout << "~Base()\n";
     } // 非虚！
};

class Derived : public Base
{
public:
    Derived()
    {
        //cout << "Derived()\n";
        p = new int[1024*1024];
    } // 分配 4 KB
    ~Derived()
    {
        //cout << "~Derived()\n";
        delete[] p;
    }

private:
    int *p;
};

/**
 * @brief 主函数，演示基类指针指向子类对象时的析构行为。
 *
 * 该函数通过循环创建子类对象并将其赋值给基类指针，然后删除指针。
 * 如果基类的析构函数未声明为虚函数（virtual），则子类的析构函数不会被调用，
 * 可能导致资源泄漏或其他未定义行为。
 *
 * @note 此代码用于说明虚析构函数的重要性。
 * @warning 基类析构函数未声明为虚函数时，子类析构函数不会被调用。
 *
 * @return int 返回值为0，表示程序正常退出。
 */
int main()
{
    for (int i = 0; i < 100; ++i)
    {
        Base *ptr = new Derived(); // 向上转型
        // 基类指针指向子类对象时，如果基类的析构函数不是virtual，那么子类的析构函数将不会被调用
        delete ptr; // 只调用 Base::~Base
    }
    // cout << "loop finished, press enter to exit...\n";
    getchar();
    return 0;
}